// 死锁
// case_1：线程加锁后，没有释放互斥锁就退出了

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

pthread_mutex_t g_lock;

// 线程A入口函数
void* thread_start_A(void* arg)
{
    // 线程A拿锁后不释放，直接退出
    pthread_mutex_lock(&g_lock);
    printf("i am thread_A\n");
    pthread_exit(NULL);
}

// 线程B入口函数
void* thread_start_B(void* arg)
{
    while(1)  // 线程B循环强锁
    {
        // 线程B拿锁，正常释放再退出
        pthread_mutex_lock(&g_lock);
        printf("i am thread_B\n");
        pthread_mutex_unlock(&g_lock);
        sleep(1);
    }
}

int main()
{
    // 初始化锁
    pthread_mutex_init(&g_lock, NULL);
    // 创建两个线程
    pthread_t A;
    pthread_t B;
    
    int ret = pthread_create(&B, NULL, thread_start_B, NULL);
    if(ret < 0)
    {
        perror("pthread_create_B");
        return 0;
    }
    ret = pthread_create(&A, NULL, thread_start_A, NULL);
    if(ret < 0)
    {
        perror("pthread_create_A");
        return 0;
    }

    // 主线程线程等待
    pthread_join(A, NULL);
    pthread_join(B, NULL);

    // 销毁锁
    pthread_mutex_destroy(&g_lock);
    return 0;
}
